home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
098
/
curses.arc
/
TC.C
< prev
Wrap
Text File
|
1985-07-08
|
41KB
|
1,590 lines
#include <stdio.h>
#include <dos.h>
#include <fcntl.h>
#include <ctype.h>
#include "scr.h"
#define NROWS 24
#define BAD -1
#define GOOD 1
#define NCOLS 80
#define true 1
#define false 0
#define rom_call 0x10
#define HILIT_ON 8
#define BLINK 128 /* may be 176 */
#define REVERSE 0x70
#define NORMAL 7
#define HIGHLIGHT 15
#define BHIGHLIGHT 184
#define UNDERLINE 1
#define alpha 'A'
#define ucase 'U'
#define numeric 'N'
#define floatting 'F'
#define date 'D'
#define telephone 'T'
#define invisible 'I'
#define soc_sec 'S'
#define reg 'R'
#define nothing 0
#define dec_point 229 /* representation of decimal point */
#define clear() (wclear(stdscr))
#define move(c, c1) (wmove(stdscr, c, c1))
#define delch() (wdelch(stdscr))
#define deleteln() (wdeleteln(stdscr))
#define addch(c) (waddch(stdscr, c))
#define clrtoeol() (wclrtoeol(stdscr))
#define clrtobot() (wclrtobot(stdscr))
#define insertln() (winsertln(stdscr))
#define insch(c) (winsch(stdscr, c))
#define inch() (winch(stdscr))
#define standout() (wstandout(stdscr))
#define standend() (wstandend(stdscr))
#define scroll() (wscroll(stdscr))
#define echo() (0)
#define noecho() (0)
#define nl() (0)
#define nonl() (0)
#define addstr(c) (waddstr(stdscr, c))
#define refresh() (wrefresh(stdscr))
#define mvprint(r, c, s) move(r,c); addstr(s); refresh()
#define mvclear(r, c) move(r, c); clrtoeol(); refresh()
char *malloc(), *scr_buff, *strcat(), *strupr(), *strchr();
char *lf = "\n", *lf_cr = "\n\r";
int nkey, key_code[100][5], retrace = true;
int page_size, line_size, user_page, printer;
int mcv();
typedef struct win_struct {
int row_org, col_org;
int row_max, col_max;
int row, col;
int first_row, first_col;
int last_row, last_col;
int first_pos, last_pos;
int char_pos; /* current char position */
char *buff; /* current buffer */
int no_change;
int buff_len; /* total buffer lenght */
int attrib; /* atrribute */
int scroll_fl; /* scroll flag */
int box_flag; /* box flag */
struct win_struct *next;
} Window;
Window *stdscr, *firstw = 0;
Window *curr_wind;
typedef struct Inkey_type {
int flen; /* field lenght */
char *recipient; /*the receiving the chars */
int displ_flag; /* display flag */
int ret_val;
int char_flag; /* to be upper or lower case or numeric */
Window *win;
} Inkey_type;
struct formatted {
int frow,fcol;
int flen;
int nature; /* alpha, ucase,numeric,flotting */
int decimal; /* number of decimal point */
};
double atof();
double getdouble();
long getlong();
typedef long val_t, uval_t;
char *convert(), *uconvert();
static char *buff;
static double round[] = {
0.5e+0,
0.5e-1,
0.5e-2,
0.5e-3,
0.5e-4,
0.5e-5,
0.5e-6,
0.5e-7,
0.5e-8,
0.5e-9,
0.5e-10,
0.5e-11,
0.5e-12,
0.5e-13,
0.5e-14,
0.5e-15,
0.5e-16,
};
last_update(win)
Window *win;
{ int i, j;
if (win->first_pos == -1 || win->char_pos < win->first_pos) {
win->first_row = win->row;
win->first_col = win->col;
win->first_pos = (win->row * win->col_max + win-> col) * 2;
}
if (win->last_pos == -1 || win->last_pos < win->char_pos) {
win->last_row = win->row;
win->last_col = win->col;
win->last_pos = (win->row * win->col_max + win->col) * 2;
}
win->no_change = false;
}
Window * newwin(org_row, org_col, nrow, ncol)
int org_row, org_col, ncol, nrow;
{ Window *wd;
char *pt, *pt1;
int i, j;
if (org_row < 0 || org_row > 24 || org_col < 0 || org_col > 80 ) return (0);
if (nrow < 0 || nrow + org_row > 24 || ncol < 0 || ncol + org_col > 80)
return(0);
if (!(wd = (Window *) malloc(sizeof(Window)))) return(0);
wd->buff_len = nrow * ncol * 2;
if (!(wd->buff = malloc(wd->buff_len))) {
free((char *) wd);
return(0); /* no more free space */
}
wd->row_max = nrow;
wd->col_max = ncol;
wd->row_org = org_row;
wd->col_org = org_col;
wd->attrib = NORMAL; /* normal */
wd->char_pos = 0;
wd->first_pos = wd->last_pos = wd->first_row = wd->last_row = -1;
wd->no_change = true;
wd->next = firstw;
wd->scroll_fl = false;
firstw = wd;
wd->first_pos = wd->last_pos = wd->first_col = wd->last_col = -1;
wd->first_pos = wd->last_pos = -1;
wclear(wd);
wd->char_pos = 0; wd->row = wd->col = 0;
wd->first_pos = wd->last_pos = wd->first_row = wd->last_row = -1;
wd->no_change = true;
wd->box_flag = false;
return(wd);
}
waddch(win, mchar)
Window *win;
int mchar; /* add char to window */
{ int i;
if (!good_window(win))return;
win->buff[win->char_pos +1] = win->attrib; /* store attribut */
win->buff[win->char_pos] = mchar;
last_update(win); /* update last char pos */
}
waddstr(win, str)
Window *win;
char *str;
{
add_string(win, str, 1); /* add string with current attribute */
}
wclear(win) /* clear window */
Window *win;
{
if (! good_window(win)) return;
clr_buff(win->buff, win->buff_len, ' ', NORMAL);
wmove(win, win->row_max -1, win->col_max -1);
last_update(win);
wmove(win, 0, 0);
last_update(win);
}
wclrtobot(win) /* clear to end of frame in window */
Window *win;
{ int i, j;
if (! good_window(win)) return;
last_update(win);
i = win->buff_len - win->char_pos;
clr_buff((win->buff) + win->char_pos, i, ' ', NORMAL);
i = win->row;
j = win->col;
wmove(win, win->row_max -1, win->col_max -1 );
last_update(win);
wmove(win, i, j);
}
wclrtoeol(win) /* clear to end of line on window */
Window *win;
{ int i,j;
if (!good_window(win)) return;
last_update(win);
i = (win->col_max - win->col) * 2;
clr_buff((win->buff) + win->char_pos, i, ' ', NORMAL);
i = win->col;
wmove(win, win->row, win->col_max -1);
last_update(win);
wmove(win, win->row, i);
}
wdelch(win) /* delete char from window */
Window *win;
{ int i, j;
char *pt, *pt1;
if (!(good_window(win))) return;
last_update(win);
i = (win->col_max - win->col -1) *2;
pt = win->buff + win->char_pos;
for (pt1 = pt +2 ; i > 0; *pt ++ = *pt1 ++, i--);
*pt ++ = ' '; /* blank end of line */
*pt = win->attrib;
i = win->col;
wmove(win, win->row, win->col_max -1);
last_update(win);
wmove(win, win->row, i);
}
wdeleteln(win) /* delete one line from the window */
Window *win;
{ int i, j;
char *pt, *pt1;
if (! good_window(win)) return;
i = (win->row_max - win->row - 1) * win->col_max * 2; /* # oc cols */
pt = win->buff + win->row * win->col_max * 2;
if (i ) {
pt1 = pt + win->col_max * 2; /* we are going to move things backward */
for (; i > 0; *pt ++ = *pt1 ++, i--);
}
i = win->row;
clr_buff(pt, win->col_max * 2, ' ', win->attrib); /* clear last line */
wmove(win, win->row_max -1, win->col_max -1);
last_update(win);
wmove(win, i, 0);
last_update(win);
}
wexptab(win) /*expand tab in the window */
Window *win;
{ int i;
if (! good_window(win)) return;
i = (win->col - win->col % 8) + 8;
if (i >= win->col_max) i = win->col_max - 1;
wmove(win, win->row, i);
}
winch(win) /* get one char from screen */
Window *win;
{ char *pt;
unsigned int i, j;
if (! good_window(win)) return;
pt = win->buff + win->char_pos;
i = *pt + *(pt +1) * 256; /* pack char and attribute */
return(i);
}
winsch(win, ch) /* insert a char */
Window *win;
int ch;
{ int i, j;
char *pt, *pt1;
if (! good_window(win)) return;
last_update(win);
i = (win->row +1) * win->col_max * 2 - 3;
pt1 = win->buff + i; /* end of buffer - 1 char */
pt = pt1 +2; /* end of buffer */
i = (win->col_max - win->col -1) * 2;
for (; i > 0; *pt -- = *pt1 --, i--); /* move backward */
*pt -- = win->attrib; /* attribute */
*pt = ch ; /* insert ch */
i = win->col;
wmove(win, win->row, win->col_max -1);
last_update(win);
wmove(win, win->row, i);
}
winsertln(win) /* insert a line in window */
Window *win;
{ int i, j;
char *pt, *pt1;
if (! good_window(win)) return;
wmove(win, win->row, 0);
last_update(win);
pt1 = win->buff + win->buff_len -1; /* end of buffer */
pt = pt1 - win->col_max * 2; /* source to move */
i = (win->row_max - win->row -1) * win->col_max *2; /* # of elems */
for (; i > 0; i--, *pt1 -- = *pt --); /* move now */
wclrtoeol(win);
j = win->row;
wmove(win, win->row_max -1, win->col_max -1);
last_update(win);
wmove(win, j, 0);
}
wmove(win, row, col)
int row, col;
Window *win;
{
if (!good_window(win)) return;
win->row = row % win->row_max;
win->col = col % win->col_max;
win->char_pos = (win->row * win->col_max + win->col) * 2;
}
woverch(win, mchar)
Window *win;
int mchar;
{ if (! good_window(win)) return;
win->buff[win->char_pos] = mchar;
last_update(win);
}
woverstr(win, s) /* overlay string over some thing */
Window *win;
char *s;
{ /* add sgtring without changing the attribute */
add_string(win, s, 0);
}
wprintf(fmt, args)
char *fmt;
unsigned args;
{ char s[200];
buff = s;
format(mcv, fmt, &args);
*buff = 0;
addstr(s);
}
wprintfw(win, fmt, args)
Window * win;
char *fmt;
unsigned args;
{ char s[200];
buff = s;
format(mcv, fmt,&args);
*buff = 0;
waddstr(win, s);
}
mcv(c)
{ return(*buff ++ = c & 0xff); }
wrefresh(win) /* refresh window */
Window *win;
{ int colx, rowx, row, col, i, j, n, m;
char *pt;
if (! good_window(win)) return;
if (win->no_change || win->first_pos == -1 || win->last_pos == -1) {
locate(win->row + win->row_org, win->col + win->col_org);
return;
}
m = win->col_max * 2;
rowx = win->first_row + win->row_org;
pt = win->first_pos + win->buff;
col = win->first_col;
i = win->last_pos - win->first_pos + 2; /* total number of char to send */
for (row = win->first_row; i > 0 && row <= win->last_row; rowx ++, row ++) {
colx = win->col_org + col;
j = (win->col_max - col) * 2; /* compute number of chars to send */
n = (j < i) ? j : i;
loc_update(rowx, colx, pt, n/2);
pt += n ;
i -= n ;
col = 0;
}
locate(win->row + win->row_org, col + win->col + win->col_org);
set_nochange(win);
}
wscroll(win) /* scroll up */
Window *win;
{ int i, j;
char *pt, *pt1;
if (! good_window(win)) return;
u_scroll(win->row_org, win->col_org, win->row_org + win->row_max - 1,
win->col_org + win->col_max - 1);
memcpy(win->buff, win->buff + (i = win->col_max *2),
(j = (win->row_max -1) * win->col_max * 2));
clr_buff(win->buff + j, i, ' ', NORMAL);
pt = win->buff; /* transfer window to screen pad */
pt1 = scr_buff+(win->row_org * 80 + win->col_org)*2; /* offset into buffer */
j = win->col_max * 2;
for (i = 0 ; i < win->row_max; i++) {
memcpy(pt1, pt, j); /* move one row of infow */
pt1 += 80 * 2; /* next row on the screen */
pt += j;
}
set_nochange(win);
}
wstandend(win) /* hilit end */
Window *win;
{
if (! good_window(win)) return;
win->attrib &= ~HILIT_ON; /* hilit off manifest constant */
}
wstandout(win)
Window *win;
{
if (! good_window(win)) return;
win->attrib |= HILIT_ON;
}
wsetattrib(win, atrb) /* set window attribute */
Window *win;
int atrb;
{ int i;
if ( ! good_window(win)) return;
win->attrib = atrb;
}
wusetattrib(win, atrb) /* unset attribute */
Window *win;
int atrb;
{
if (! good_window(win)) return;
win->attrib = NORMAL;
}
scrollok(win, ok) /* scroll ok */
Window *win;
int ok;
{
if (! good_window(win)) return;
win->scroll_fl = ok;
}
box(win)
Window *win;
{ int i, j, row, col;
char s[3];
if (! good_window(win)) return(BAD);
row = win->row_org - 1;
col = win->col_org -1 ;
s[1] = NORMAL;
if (win->row_org == 0 || win->col_org == 0 || win->row_max == NROWS
|| win->col_max == NCOLS) return;
col = win->col_org - 1;
row = win->row_org -1;
for (i = 0; i <= win->row_max +1; i++, row ++) {
if (i == 0 ) {
s[0] = 201; /* left corner */
box_char(row, col, s);
s[0] = 187; /* right corner */
box_char(row, win->col_org + win->col_max, s);
}
if (i == win->row_max +1 || i == 0 ) {
s[0] = 205;
for (j = 1; j < win->col_max +1; j++)
box_char(row, j + col, s);
}
if (i == win->row_max+1) {
s[0] = 200; /* leeft down corner */
box_char(row, col, s);
s[0] = 188; /* right down corner */
box_char(row, col + win->col_max + 1, s);
}
if ( i && i != win->row_max +1) {
s[0] = 186;
box_char(row, col, s);
box_char(row, col+ win->col_max+1, s);
}
}
win->box_flag = true;
}
box_char(row, col,s )
int row, col;
char *s;
{ char *p;
p = scr_buff + (row * NCOLS + col) * 2;
*p ++ = *s;
*p = s[1];
write_attrib(row, col, s);
}
delwin(win) /* get rid of a wondow */
Window *win;
{ Window *wd, *wd1;
int done;
if (! good_window(win)) return(BAD);
if (win->box_flag) erase_box(win);
wclear(win);
wrefresh(win);
free(win->buff);
for (wd = wd1 = firstw, done = false; ! done; ) {
if (wd == win) done = true;
else {
wd1 = wd;
wd = wd->next;
}
}
wd1->next = wd->next;
if (wd == firstw) firstw = wd->next;
free((char *) win);
return(GOOD);
}
erase_box(win)
Window *win;
{ int i, j, row, col;
char s[3];
if (! good_window(win)) return(BAD);
row = win->row_org - 1;
col = win->col_org -1 ;
s[1] = NORMAL;
s[0] = ' ';
if (win->row_org == 0 || win->col_org == 0 || win->row_max == NROWS
|| win->col_max == NCOLS) return;
col = win->col_org - 1;
row = win->row_org -1;
for (i = 0; i <= win->row_max +1; i++, row ++) {
if (i == 0 ) {
box_char(row, col, s);
box_char(row, win->col_org + win->col_max, s);
}
if (i == win->row_max +1 || i == 0 ) {
for (j = 1; j < win->col_max +1; j++)
box_char(row, j + col, s);
}
if (i == win->row_max+1) {
/* leeft down corner */
box_char(row, col, s);
/* right down corner */
box_char(row, col + win->col_max + 1, s);
}
if ( i && i != win->row_max +1) {
box_char(row, col, s);
box_char(row, col+ win->col_max+1, s);
}
}
}
touch(win)
Window *win;
{ int row, col, rowx, colx;
if (! good_window(win)) return;
win->first_row = win->first_col = win->first_pos = 0;
win->last_row = win->row_max - 1;
win->last_col = win->col_max - 1;
win->last_pos = win->row_max * 2 * win->col_max;
win->no_change = false;
wrefresh(win);
if (win->box_flag) box(win);
}
add_string(win, str, attrib_flag)
Window *win;
char *str;
int attrib_flag;
{ int i, j;
char *pt;
if (! good_window(win)) return;
pt = win->buff + win->char_pos;
last_update(win);
for ( i = win->col; *str && i < win->col_max; i ++, str ++) {
*pt ++ = *str;
if (attrib_flag) *pt ++ = win->attrib;
else pt ++; /* add string conserving the attribute*/
win->char_pos += 2;
}
j = win->col;
if (i >= win->col_max) i = win->col_max -1 ;
wmove(win, win->row, i);
last_update(win);
wmove(win, win->row, j); /* restore last cursor position */
}
clr_buff(s, len, c, attrib)
int len, attrib;
char *s, c;
{ int i, j;
for (i = 0; i < len; i += 2) {
*s ++ = c;
*s ++ = attrib;
}
}
good_window(win)
Window *win;
{ int found;
Window *fw;
for (found = false, fw = firstw; !found && fw; fw = fw->next) {
if (win == fw) {
found = true;
break;
}
}
return(found);
}
loc_update(row, col, pt, len) /* update the location on the screen */
int row, col, len;
char *pt;
{ int i, j;
char *pt1;
struct SREGS sregs;
i = (row * 80 + col) * 2;
pt1 = scr_buff + i;
if (retrace) {
for (i = 0; i < len ; i++, col ++) {
if (*pt != *pt1 || *(pt+1) != *(pt1 + 1)) {
write_attrib(row, col, pt);
*pt1 ++ = *pt ++; /* uptdate these locations */
*pt1 ++ = *pt ++;
}
else {
pt += 2;
pt1 += 2;
}
}
}
else { /* move directly to screen if in an ibm */
movedata(FP_SEG(pt), FP_OFF(pt), 0xb000, i, len * 2);
memcpy(pt1, pt, len * 2); /* update memory too */
}
}
noraw() /* raw mode set */
{ union REGS inreg, outreg;
inreg.x.bx = 1; /* i/o control read request */
inreg.x.ax = 0x4400;
int86(0x21, &inreg, &outreg); /* i/o control read */
inreg = outreg;
inreg.h.dh = 0;
inreg.h.dl &= ~ 0x20; /* set raw bit */
inreg.x.bx = 1; /* i/o control write request */
inreg.x.ax = 0x4401;
int86(0x21, &inreg, &outreg);
}
raw() /* raw mode set */
{ union REGS inreg, outreg;
inreg.x.bx = 1; /* i/o control read request */
inreg.x.ax = 0x4400;
int86(0x21, &inreg, &outreg); /* i/o control read */
inreg = outreg;
inreg.h.dh = 0;
inreg.h.dl |= 0x20; /* set raw bit */
inreg.x.bx = 1; /* i/o control write request */
inreg.x.ax = 0x4401;
int86(0x21, &inreg, &outreg);
}
set_nochange(win)
Window *win;
{ win->no_change = true;
win->first_row = win->last_row = win->first_col = win->last_col = -1;
win->first_pos = win->last_pos = -1;
}
u_scroll(y0, x0, y3, x3) /* scroll up */
int y0, x0, y3, x3;
{
do_scroll(y0, x0, y3, x3, 6);
}
d_scroll(y0, x0, y3, x3) /* down scroll */
int y0, x0, y3, x3;
{
do_scroll(y0, x0, y3, x3, 7);
}
do_scroll(row0, col0, row3, col3, call_type) /* scroll up */
int row0, col0, col3, row3, call_type;
{ union REGS inreg, outreg;
inreg.h.ch = row0; /* set x0, y0 */
inreg.h.cl = col0;
inreg.h.dh = row3;
inreg.h.dl = col3;
inreg.h.bh = NORMAL;
inreg.h.al = 1;
inreg.h.ah = call_type; /* service code */
int86(rom_call, &inreg, &outreg);
}
cursorsize(begl, endl)
int begl,endl;
{ union REGS inreg, outreg;
inreg.h.ah = 1; /* set cursor position */
inreg.h.cl = endl;
inreg.h.ch = begl;
int86(rom_call, &inreg, &outreg);
}
/*** end of active routines */
/* ##a */
alinkey(nrow, ncol, message, len, s)
int nrow, ncol, len;
char *s, *message;
{ int i, j;
char_clear(s, len, ' ');
return(get_inkstring(stdscr, nrow, ncol, message, len, s));
}
/* ##b */
bell()
{ putchar(7); }
/* ##c */
static char_clear(s, len, c)
register char *s, c;
register int len;
{
for (; len > 0 ; *s ++ = c, len--);
*s = 0;
}
cls() /* clear screen */
{ union REGS inreg, outreg;
inreg.x.ax = 0x7; /* set mode and clear screen */
int86(rom_call, &inreg, &outreg);
if (scr_buff != 0) clr_buff(scr_buff, 80 * 24 * 2, ' ', NORMAL);
}
cls_eol(row, col)
int row, col;
{ int i, j;
union REGS inreg, outreg;
locate(row, col);
if (! (inreg.x.cx = 80 - col)) return;
inreg.x.bx = 0x7; /* normal mode*/
inreg.h.ah = 9; /* service call */
inreg.h.al = 32; /* char to used */
int86(rom_call, &inreg, &outreg);
}
cls_eof(row, col) /* clear to end of screen */
int row, col;
{ int i, j;
union REGS inreg, outreg;
locate(row, col);
inreg.x.cx = (24 - row) * 80 - col;
inreg.x.bx = 0x7; /* attributes */
inreg.h.al = 32;
inreg.h.ah = 9; /* service call */
int86(rom_call, &inreg, &outreg);
}
concate(s, s1, s2)
char *s, *s1, *s2;
{ strcpy(s, s1);
strcat(s, s2);
}
/* ##d */
doinput(curr_wind, finput, recip, ret_val)
Window *curr_wind;
int *ret_val;
char *recip;
struct formatted *finput;
{ char s[300], s1[300];
int i, j;
Window win;
Inkey_type ink;
double temp;
if (finput->nature == numeric || finput->nature == floatting) {
trim(s, recip); /* left justify numeric */
lset(recip, s); /* do it now */
ink.char_flag = (finput->decimal) ? numeric : floatting;
}
else ink.char_flag = finput->nature;
ink.flen = finput->flen;
ink.ret_val = *ret_val;
win.next = firstw;
firstw = &win; /* add tenmporary to list */
set_winkey(curr_wind, &win, finput->frow, finput->fcol, finput->flen);
ink.win = &win;
ink.displ_flag = true;
ink.recipient = recip;
wmove(curr_wind, finput->frow, finput->fcol);
win.attrib = ret_attrib(curr_wind); /* get attribute at location */
zaskey(&ink);
if (finput->nature == numeric || finput->nature == floatting) {
temp = atof(recip);
if (finput->decimal == 0) {
sprintf(s1, "%%%dd", finput->flen);
sprintf(s, s1, (int) temp);
rset(recip, s);
}
else {
sprintf(s1, "%%%d.%df", finput->flen, finput->decimal);
sprintf(s, s1, temp);
rset(recip, s);
}
wmove(&win, 0, 0);
woverstr(&win, recip);
wrefresh(&win);
}
*ret_val = ink.ret_val;
firstw = win.next;
}
/* ##e */
error_message(message)
char *message;
{ bell();
cls_eol(24, 0);
cprintf("%s", message);
kcget();
cls_eol(24, 0);
}
/* ##f */
fill_char(s, len, ch)
char *s, ch;
int len;
{ int i;
for (i = 0; i ++ < len; *s ++ = ch);
*s = 0;
}
filter(mchar)
int mchar;
{ int i, j, cmc;
if ((cmc = mchar) >= 32 && mchar <= 127) return(mchar);
if (!cmc) {
cmc = single_char();
j = 2;
}
else j = 1;
for (i= 0; i < nkey; ) {
if (key_code[i][j] == cmc) {
if (j == 4) return(key_code[i][0]);
if ( !key_code[i][j+1]) return(key_code[i][0]);
j ++; cmc = single_char();
}
else i++;
}
return(mchar);
}
/* ##g */
get_inkstring(inwind, nrow, ncol, message, len, s)
Window *inwind;
int nrow, ncol, len;
char *message, *s;
{ int i, j;
Window win;
Inkey_type ink;
ink.char_flag = ucase;
ink.ret_val = 0;
wmove(inwind, nrow, ncol);
wstandout(inwind);
waddstr(inwind, message);
wstandend(inwind);
wrefresh(inwind);
win.next = firstw;
firstw = &win; /* add tenmporary to list */
set_winkey(inwind, &win, nrow, ncol + strlen(message)+1, len);
ink.displ_flag = true;
ink.recipient = s;
ink.win = &win;
win.attrib = UNDERLINE;
wmove(&win, 0, 0);
waddstr(&win, s);
zaskey(&ink);
firstw = win.next; /* restore firstw */
return(ink.ret_val);
}
/* ##i */
inkey(finput, recip, ret_val)
int *ret_val;
char *recip;
struct formatted *finput;
{
doinput(curr_wind, finput, recip, ret_val);
}
initscr()
{
if (! (stdscr = newwin(0, 0, 24, 80))) exit();
cls();
if ( !(scr_buff = malloc(80 *24 * 2))) {
fprintf(stderr, "Out of memory\n");
exit();
}
memcpy(scr_buff, stdscr->buff, 80*24*2);
curr_wind = stdscr; /* set current window to stdscr */
/* touch(stdscr); */
}
instring(s, s1)
register char *s1, *s;
{ register char *p;
register i, j;
for (i = strlen(s), j = strlen(s1), p = s; i >= j; p++, i--) {
if (!strncmp(p, s1, j)) return((int) (p -s));
}
return(-1);
}
/* ##k */
kcget()
{
return(filter(single_char() & 0xff));
}
kcinit() /* init the keyboard filter */
{ FILE *fd, *fopen();
char line[90], s[50], *getenv();
int n, i;
concate(s, "/terminal/", getenv("KEYB"));
if (!(fd = fopen(s, "r"))) {
fprintf(stderr, "Cannot open the keyboad configuration file %s\n", s);
exit();
}
n = fileno(fd);
setmode(n, O_TEXT); /* make sure we are in text mode */
for ( nkey = 0; fgets(line, 80, fd); nkey ++) {
sscanf(line, "%d %d %d %d %d", &key_code[nkey][0], &key_code[nkey][1],
&key_code[nkey][2], &key_code[nkey][3], &key_code[nkey][4]);
}
fclose(fd);
retrace = atoi(getenv("RETRACE"));
open_printer();
line_size = 80;
user_page = 20;
page_size = 24;
}
key_punched()
{ union REGS inreg, outreg;
inreg.h.ah = 0x0b;
intdos(&inreg, &outreg);
return(outreg.h.al);
}
/* ##l */
left_trim(s, s1) /* trim leading blanks */
register char *s1, *s;
{ int i, j;
for (; *s1 && *s1 == ' '; s1 ++); /* found first non blk */
strcpy(s, s1); /* copy remainder to s */
}
locate(row, col)
int row, col;
{ union REGS inreg, outreg;
inreg.h.bh = 0; /* page number */
inreg.h.dh = row;
inreg.h.dl = col;
inreg.h.ah = 2; /* service number */
int86(rom_call, &inreg, &outreg);
}
lset(s, s1)
char *s1, *s;
{ fill_char(s, strlen(s), ' ');
left_trim(s1, s1);
for (; *s && *s1; *s ++ = *s1 ++);
}
/* ##n */
ninkey(nrow, ncol, message, len)
int nrow, ncol, len;
char *message;
{ Inkey_type ink;
char s[200];
Window win, *inwind;
int i;
inwind = stdscr;
ink.displ_flag = false;
ink.ret_val = 0;
ink.char_flag = numeric;
ink.recipient = s;
char_clear(s, len, ' ');
wstandout(inwind);
wmove(inwind, nrow, ncol);
waddstr(inwind, message);
wstandend(inwind);
wrefresh(inwind);
win.next = firstw;
firstw = &win;
set_winkey(inwind, &win, nrow, ncol + strlen(message) +1, len);
ink.win = &win;
win.attrib = UNDERLINE;
zaskey(&ink);
firstw = win.next; /* reset firsw to its previous value */
return(atoi(s));
}
/* ##o */
one_char() /* get achar from key */
{
return(kcget());
}
open_printer()
{ printer = fileno(stdprn);
setmode(printer, O_BINARY);
}
/* ##p */
print_at(row, col, s)
int row, col;
char *s;
{ if (row < 24) {
mvprint(row, col, s);
}
else {
locate(row, col);
cprintf("%s", s);
}
}
/* ##r */
ret_attrib(win)
Window *win;
{ return(win->buff[win->char_pos+1]);
}
right_trim(s, s1)
char *s;
register char *s1;
{ register int i, j;
i = strlen(s1) - 1;
for (; i >= 0 && s1[i] == ' '; i--);
if (i < 0) *s = 0;
else {
s1[i+1] = 0;
strcpy(s, s1);
}
}
rset(s, s1)
char *s, *s1;
{ int i, j;
trim(s1, s1);
fill_char(s, (i = strlen(s)), ' ');
j = strlen(s1) - 1;
for ( i--; i >= 0 && j >= 0; s[i --] = s1[j--]);
}
/* ##s */
set_winkey(inwind, win, nrow, ncol, len)
Window *inwind, *win;
int nrow, ncol, len;
{ int i;
win->row_org = inwind->row_org + nrow;
win->col_org = inwind->col_org + ncol;
win->col_max = len;
win->row_max = 1;
i = (nrow * inwind->col_max + ncol) * 2;
win->buff = inwind->buff + i;
wmove(win, 0, 0);
win->attrib = inwind->attrib;
set_nochange(win);
}
single_char() /* just read one single char */
{ union REGS inreg, outreg;
inreg.h.ah = 8; /* bdos call for input char */
inreg.x.dx = inreg.x.cx = 0;
intdos(&inreg, &outreg);
return(outreg.h.al & 0xff);
}
space(s)
char *s;
{ for (; *s && *s == ' '; s++);
return ( (*s) ? false : true) ;
}
/* ##t */
trim(s, s1)
char *s, *s1;
{ left_trim(s, s1);
right_trim(s, s);
}
/* ##w */
write_attrib(row, col, pt)
int row, col;
char *pt;
{ union REGS inreg, outreg;
locate(row, col);
inreg.h.bh = 0; /* page one */
inreg.h.al = *pt ++ ; /* char to write */
inreg.h.bl = *pt; /* atrribute */
inreg.x.cx = 1; /* number of chars */
inreg.h.ah = 9; /* rom call service number */
int86(rom_call, &inreg, &outreg);
}
winkey(win, finput, recip, ret_val)
int *ret_val;
Window *win;
char *recip;
struct formatted *finput;
{
doinput(win, finput, recip, ret_val);
}
/* ##z */
zaskey(ink)
Inkey_type *ink;
{ int c, done, used, i, ins_flag, store_flag;
char *p, *s ;
ins_flag = false;
wmove(ink->win, 0, 0);
if (ink->displ_flag) woverstr(ink->win, ink->recipient);
else {
for (i = 0, c = ' '; i < ink->win->col_max; i++) {
wmove(ink->win, 0, i);
woverch(ink->win, c);
}
}
wrefresh(ink->win);
for (used = 0, done = false; ! done; ) {
wmove(ink->win, 0, used);
wrefresh(ink->win);
switch((c = kcget())) {
case BACKSPACE :
case LEFT : if (used > 0) used --;
break;
case RIGHT : if (used < ink->win->col_max - 1) used ++;
else if (ink->ret_val == -1) {
ink->ret_val = RIGHT;
done = true;
}
break;
case ESC :
case UP :
case DOWN :
case F10 :
case 13 : done = true;
ink->ret_val = c;
break;
case INSERT : ins_flag = ins_flag ? false : true;
break;
case DELETE : wdelch(ink->win);
break;
default : store_flag = false;
c &= 0xff;
if (isascii(c) || c == '.') {
if (ink->char_flag == numeric ||
ink->char_flag == floatting) {
if (c == '-' || c == '+' || isdigit(c)
|| c == '.' || c == ' ') {
store_flag = true;
/* if (c == '.' && ink->char_flag !=floatting)
store_flag = false; */
}
}
else {
if (ink->char_flag == ucase) c = toupper(c);
store_flag = true;
}
}
if (store_flag) {
if (ins_flag) {
winsch(ink->win, c);
}
else woverch(ink->win, c);
if (used < ink->win->col_max - 1) used ++;
else if (ink->ret_val == -1) {
ink->ret_val = 13;
done = true;
}
}
}
}
p = ink->win->buff;
for (s = ink->recipient, i = 0; i < ink->win->col_max; i++) {
*s ++ = *p ++;
*p++; /* pass the attribute */
}
*s = 0;
wrefresh(ink->win);
}
wprint_at(win, row, col, s)
Window *win;
int row, col;
char *s;
{
wmove(win, row, col);
waddstr(win, s);
wrefresh(win);
}
/* **************************** FORNAT PROGRAM */
format(putsub, fmt, args)
register int (*putsub)(); register char *fmt; char *args;
{
register int c;
int rj, fillc, *intarg;
int maxwidth, width;
val_t value;
long *longarg;
int i, k;
unsigned *oldarg;
char *cp, **ap;
char s[400];
double dval;
while ( c = *fmt++ ) {
if ( c == '%' ) {
oldarg = args;
s[14] = 0;
rj = 1;
fillc = ' ';
maxwidth = 0x7fff;
if ( (c = *fmt) == '-' ) {
rj = 0;
c = *fmt++;
}
if ( c == '0' )
fillc = '0';
if (c == '*') {
width = getint(&args);
c = *fmt++;
} else {
c = *fmt ++;
for (width = 0 ; isdigit(c); c = *fmt++ )
width = width*10 + c - '0';
}
if ( c == '.' ) {
if ((c = *fmt++) == '*') {
maxwidth = getint(&args);
c = *fmt++;
} else {
for (maxwidth = 0 ; isdigit(c) ; c = *fmt++)
maxwidth = maxwidth*10 + c - '0';
}
}
if (c == 'l') {
c = *fmt++;
value = getlong(&args);
} else if (c == 'd')
value = getint(&args);
else if (c == 'e' || c == 'f' || c == 'g')
dval = getdouble(&args);
else if (c != 's') value = getint(&args);
switch ( c ) {
case 'o':
cp = uconvert(value, 8, s+14);
break;
case 'd':
if ( value < 0 ) {
cp = convert(-value, 10, s+14);
*--cp = '-';
} else
cp = convert(value, 10, s+14);
break;
case 'u':
cp = uconvert((val_t)(uval_t)value, 10, s+14);
break;
case 'x':
cp = uconvert(value, 16, s+14);
break;
case 's':
ap = (char * *) args;
i = strlen(cp = *ap);
args += sizeof(char *);
goto havelen;
case 'e':
case 'f':
ftoa(dval, s, maxwidth==0x7fff?6:maxwidth, c=='e'?0:1);
i = strlen(cp = s);
maxwidth = 400;
goto havelen;
case 'c':
c = value;
goto defcase;
default:
args = oldarg;
defcase:
*(cp = s+13) = c;
break;
}
i = (s+14) - cp;
havelen:
if ( i > maxwidth )
i = maxwidth;
if ( rj ) {
while ( width-- > i )
(*putsub)(fillc);
}
for ( k = 0 ; *cp && k < maxwidth ; ++k )
(*putsub)(*cp++);
if ( !rj ) {
while ( width-- > i )
(*putsub)(' ');
}
} else
(*putsub)(c);
}
}
static char digits[]="0123456789abcdef";
static char *
convert(n, base, s)
register int base; register char *s; register uval_t n;
{
do {
*--s = digits[(int)(n%base)];
} while ( (n /= base) != 0 );
return s;
}
static char *
uconvert(n, base, s)
register int base; register char *s; long n;
{
register int t;
if (n < 0) {
t = (int)n&1;
n = (n>>1)&0x7fffffff;
*--s = digits[((int)(n%(base>>1))<<1)+t];
n /= base>>1;
}
return convert(n,base,s);
}
ftoa(number, buffer, maxwidth, flag)
double number; register char *buffer;
{
register int i;
int exp, digit, decpos, ndig;
int zero = 0, one = 1, ten = 10;
ndig = maxwidth+1;
if (number < zero) {
number = -number;
*buffer++ = '-';
}
exp = 0;
if (number > 0.0) {
while (number < one) {
number *= ten;
--exp;
}
while (number >= ten) {
number /= ten;
++exp;
}
}
if (flag)
ndig += exp;
if (ndig > 0) {
if ((number += round[ndig>15?15:ndig-1]) >= 10.0) {
number /= 10.0;
++exp;
if (flag)
++ndig;
}
}
if (flag) {
if (exp < 0) {
*buffer++ = '0';
*buffer++ = '.';
for (i = exp ; ++i < 0 && maxwidth ; --maxwidth)
*buffer++ = '0';
decpos = 0;
} else {
decpos = exp+1;
maxwidth += exp+1;
}
} else {
maxwidth++;
decpos = 1;
}
while (maxwidth--) {
digit = (int)number;
*buffer++ = digit+'0';
if (decpos && --decpos == 0)
*buffer++ = '.';
number = (number - digit) * ten;
}
if (decpos) {
while (--decpos)
*buffer++ = '0';
*buffer++ = '.';
}
if (!flag) {
*buffer++ = 'e';
if (exp < 0) {
*buffer++ = '-';
exp = -exp;
} else
*buffer++ = '+';
if (exp >= 100) {
*buffer++ = exp/100 + '0';
exp %= 100;
}
*buffer++ = exp/10 + '0';
*buffer++ = exp%10 + '0';
}
*buffer = 0;
}
getint(s)
char **s;
{ int *in;
in = (int *) *s;
(*s) += sizeof(int);
return(*in);
}
long getlong(s)
char **s;
{ long *lint;
lint = (long *) *s;
(*s) += sizeof(long);
return(*lint);
}
double getdouble(s)
char **s;
{ double *dval;
dval = (double *) *s;
(*s) += sizeof(double);
return(*dval);
}